package top.continew.wechat.user.controller;

import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import top.continew.wechat.common.core.Result;
import top.continew.wechat.user.dto.UserLoginDTO;
import top.continew.wechat.user.dto.UserPasswordDTO;
import top.continew.wechat.user.dto.UserRegisterDTO;
import top.continew.wechat.user.dto.UserUpdateDTO;
import top.continew.wechat.user.service.UserService;
import top.continew.wechat.user.vo.UserLoginVO;
import top.continew.wechat.user.vo.UserVO;

import javax.validation.Valid;

/**
 * 用户控制器
 */
@RestController
@RequestMapping("/api/user")
@RequiredArgsConstructor
public class UserController {

    private final UserService userService;

    /**
     * 用户注册
     *
     * @param userRegisterDTO 用户注册DTO
     * @return 注册结果
     */
    @PostMapping("/register")
    public Result<Void> register(@RequestBody @Valid UserRegisterDTO userRegisterDTO) {
        return userService.register(userRegisterDTO);
    }

    /**
     * 用户登录
     *
     * @param userLoginDTO 用户登录DTO
     * @return 登录结果
     */
    @PostMapping("/login")
    public Result<UserLoginVO> login(@RequestBody @Valid UserLoginDTO userLoginDTO) {
        return userService.login(userLoginDTO);
    }

    /**
     * 获取当前登录用户信息
     *
     * @return 用户信息
     */
    @GetMapping("/current")
    public Result<UserVO> getCurrentUser() {
        return userService.getCurrentUser();
    }

    /**
     * 根据用户ID获取用户信息
     *
     * @param userId 用户ID
     * @return 用户信息
     */
    @GetMapping("/{userId}")
    public Result<UserVO> getUserById(@PathVariable Long userId) {
        return userService.getUserById(userId);
    }

    /**
     * 更新用户信息
     *
     * @param userUpdateDTO 用户信息更新DTO
     * @return 更新结果
     */
    @PutMapping("/update")
    public Result<Void> updateUser(@RequestBody @Valid UserUpdateDTO userUpdateDTO) {
        return userService.updateUser(userUpdateDTO);
    }

    /**
     * 修改密码
     *
     * @param userPasswordDTO 用户密码修改DTO
     * @return 修改结果
     */
    @PutMapping("/password")
    public Result<Void> updatePassword(@RequestBody @Valid UserPasswordDTO userPasswordDTO) {
        return userService.updatePassword(userPasswordDTO);
    }

    /**
     * 注销登录
     *
     * @return 注销结果
     */
    @PostMapping("/logout")
    public Result<Void> logout() {
        return userService.logout();
    }
}
